package cn.com.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import cn.com.qiniu.UthinkUploader;

public class QRCodeUtils {

	/** 用户生成二维码图片的域名 */
	public static final String baseUrl = "http://wechat.sm1168.com";

	/**
	 * 调用第3方接口生成二维码
	 * 
	 * @param content
	 *            二维码信息
	 * @param file
	 *            二维码文件地址
	 * @param size
	 *            二维码图片大小
	 */
	public static String createQrCode(String content, Integer size) throws Exception {

		String urlstr = "http://qr.liantu.com/api.php?&bg=ffffff&fg=000000&text=" + content + "&w=" + size + "&m=0";
		// new一个URL对象
		URL url = new URL(urlstr);
		// 打开链接
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		// 设置请求方式为"GET"
		conn.setRequestMethod("GET");
		// 超时响应时间为5秒
		// conn.setConnectTimeout(5 * 1000);
		// 通过输入流获取图片数据
		InputStream inStream = null;
		try {
			inStream = conn.getInputStream();
		} catch (Exception e) {

		}
		// 得到图片的二进制数据，以二进制封装得到数据，具有通用性
		byte[] data = readInputStream(inStream);
		// new一个文件对象用来保存图片，默认保存当前工程根目录
		// File imageFile = new File("/Users/apple/Downloads/fawfa.png");
		String fileName = "qrcode" + DateUtil.nowTimeToString2() + ".png";
		String picaddress = UthinkUploader.send(fileName, data, 0);
		//
		// // 创建输出流
		// FileOutputStream outStream = new FileOutputStream(file);
		// // 写入数据
		// outStream.write(data);
		// // 关闭输出流
		// outStream.close();
		return picaddress;
	}

	public static byte[] readInputStream(InputStream inStream) throws Exception {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		// 创建一个Buffer字符串
		byte[] buffer = new byte[1024];
		// 每次读取的字符串长度，如果为-1，代表全部读取完毕
		int len = 0;
		// 使用一个输入流从buffer里把数据读取出来
		while ((len = inStream.read(buffer)) != -1) {
			// 用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
			outStream.write(buffer, 0, len);
		}
		// 关闭输入流
		inStream.close();
		// 把outStream里的数据写入内存
		return outStream.toByteArray();
	}

	/**
	 * 编码字符串内容到目标File对象中
	 * 
	 * @param encodeddata
	 * @param destFile
	 * @throws IOException
	 */
	// public static void qrCodeEncode(String encodeddata, File destFile) throws
	// IOException {
	// Qrcode qrcode = new Qrcode();
	// // 错误修正容量
	// // L水平 7%的字码可被修正
	// // M水平 15%的字码可被修正
	// // Q水平 25%的字码可被修正
	// // H水平 30%的字码可被修正
	// // QR码有容错能力，QR码图形如果有破损，仍然可以被机器读取内容，最高可以到7%~30%面积破损仍可被读取。
	// // 相对而言，容错率愈高，QR码图形面积愈大。所以一般折衷使用15%容错能力。
	// qrcode.setQrcodeErrorCorrect('M');
	// qrcode.setQrcodeEncodeMode('B');
	// qrcode.setQrcodeVersion(7);// 设置二维码的大小公式：67 + 12 * （version - 1）
	// byte[] d = encodeddata.getBytes("UTF-8");
	// BufferedImage bi = new BufferedImage(139, 139,
	// BufferedImage.TYPE_INT_RGB);
	// // createGraphics
	// Graphics2D g = bi.createGraphics();
	// // set background
	// g.setBackground(Color.WHITE);
	// g.clearRect(0, 0, 139, 139);
	// // 设置二维码图片颜色
	// g.setColor(Color.BLACK);
	//
	// if (d.length > 0 && d.length < 120) {
	// boolean[][] b = qrcode.calQrcode(d);
	// for (int i = 0; i < b.length; i++) {
	// for (int j = 0; j < b.length; j++) {
	// if (b[j][i]) {
	// g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
	// }
	// }
	// }
	// }
	//
	// g.dispose();
	// bi.flush();
	//
	// ImageIO.write(bi, "png", destFile);
	// System.out.println("Input Encoded data is：" + encodeddata);
	// }

	// public static void resize(File originalFile, File resizedFile, int
	// newWidth, float quality) throws IOException {
	//
	// if (quality > 1) {
	// throw new IllegalArgumentException("Quality has to be between 0 and 1");
	// }
	//
	// ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
	// Image i = ii.getImage();
	// Image resizedImage = null;
	//
	// int iWidth = i.getWidth(null);
	// int iHeight = i.getHeight(null);
	//
	// if (iWidth > iHeight) {
	// resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight) /
	// iWidth, Image.SCALE_SMOOTH);
	// } else {
	// resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight,
	// newWidth, Image.SCALE_SMOOTH);
	// }
	//
	// // This code ensures that all the pixels in the image are loaded.
	// Image temp = new ImageIcon(resizedImage).getImage();
	//
	// // Create the buffered image.
	// BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null),
	// temp.getHeight(null),
	// BufferedImage.TYPE_INT_RGB);
	//
	// // Copy image to buffered image.
	// Graphics g = bufferedImage.createGraphics();
	//
	// // Clear background and paint the image.
	// g.setColor(Color.white);
	// g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
	// g.drawImage(temp, 0, 0, null);
	// g.dispose();
	//
	// // Soften.
	// float softenFactor = 0.05f;
	// float[] softenArray = { 0, softenFactor, 0, softenFactor, 1 -
	// (softenFactor * 4), softenFactor, 0, softenFactor,
	// 0 };
	// Kernel kernel = new Kernel(3, 3, softenArray);
	// ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
	// bufferedImage = cOp.filter(bufferedImage, null);
	//
	// ImageIO.write(bufferedImage, "png", resizedFile);
	// }

	// /**
	// * 解析二维码，返回解析内容
	// *
	// * @param imageFile
	// * @return
	// */
	// public static String qrCodeDecode(File imageFile) {
	// String decodedData = null;
	// QRCodeDecoder decoder = new QRCodeDecoder();
	// BufferedImage image = null;
	// try {
	// image = ImageIO.read(imageFile);
	// } catch (IOException e) {
	// System.out.println("Error: " + e.getMessage());
	// }
	//
	// try {
	// decodedData = new String(decoder.decode(new J2SEImage(image)), "UTF-8");
	// System.out.println("Output Decoded Data is：" + decodedData);
	// } catch (DecodingFailedException dfe) {
	// System.out.println("Error: " + dfe.getMessage());
	// } catch (UnsupportedEncodingException e) {
	// e.printStackTrace();
	// }
	// return decodedData;
	// }

	// public static void main(String[] args) {
	// try {
	// // qrCodeEncode("dawdadadawdw", new
	// // File("/Users/apple/Downloads/fawfa.png"), 7);
	// resize(new File("/Users/apple/Downloads/fawfa.png"), new
	// File("/Users/apple/Downloads/newfawfa.png"), 300,
	// 1f);
	// } catch (IOException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// }

}
